package com.sky.utils;

import com.alibaba.fastjson.JSONObject;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Http工具类
 */
public class HttpClientUtil {
	
	static final int TIMEOUT_MSEC = 5 * 1000;
	
	/**
	 * 发送GET方式请求
	 *
	 * @param url
	 * @param paramMap
	 * @return
	 */
	public static String doGet(String url, Map<String, String> paramMap) {
		// 创建Httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		
		String result = "";
		CloseableHttpResponse response = null;
		
		try {
			URIBuilder builder = new URIBuilder(url);
			if (paramMap != null) {
				for (String key : paramMap.keySet()) {
					builder.addParameter(key, paramMap.get(key));
				}
			}
			URI uri = builder.build();
			
			//创建GET请求
			HttpGet httpGet = new HttpGet(uri);
			
			//发送请求
			response = httpClient.execute(httpGet);
			
			//判断响应状态
			if (response.getStatusLine().getStatusCode() == 200) {
				result = EntityUtils.toString(response.getEntity(), "UTF-8");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				response.close();
				httpClient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return result;
	}
	
	/**
	 * 发送POST方式请求
	 *
	 * @param url
	 * @param paramMap
	 * @return
	 * @throws IOException
	 */
	public static String doPost(String url, Map<String, String> paramMap) throws IOException {
		// 创建Httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		String resultString = "";
		
		try {
			// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			
			// 创建参数列表
			if (paramMap != null) {
				List<NameValuePair> paramList = new ArrayList();
				for (Map.Entry<String, String> param : paramMap.entrySet()) {
					paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
				}
				// 模拟表单
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
				httpPost.setEntity(entity);
			}
			
			httpPost.setConfig(builderRequestConfig());
			
			// 执行http请求
			response = httpClient.execute(httpPost);
			
			resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
		} catch (Exception e) {
			throw e;
		} finally {
			try {
				response.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return resultString;
	}
	
	/**
	 * 发送POST方式请求
	 *
	 * @param url
	 * @param paramMap
	 * @return
	 * @throws IOException
	 */
	public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
		// 创建Httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		String resultString = "";
		
		try {
			// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			
			if (paramMap != null) {
				//构造json格式数据
				JSONObject jsonObject = new JSONObject();
				for (Map.Entry<String, String> param : paramMap.entrySet()) {
					jsonObject.put(param.getKey(), param.getValue());
				}
				StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8");
				//设置请求编码
				entity.setContentEncoding("utf-8");
				//设置数据类型
				entity.setContentType("application/json");
				httpPost.setEntity(entity);
			}
			
			httpPost.setConfig(builderRequestConfig());
			
			// 执行http请求
			response = httpClient.execute(httpPost);
			
			resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
		} catch (Exception e) {
			throw e;
		} finally {
			try {
				response.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return resultString;
	}
	
	private static RequestConfig builderRequestConfig() {
		return RequestConfig.custom()
				.setConnectTimeout(TIMEOUT_MSEC)
				.setConnectionRequestTimeout(TIMEOUT_MSEC)
				.setSocketTimeout(TIMEOUT_MSEC).build();
	}
	
}
